Example Decorator pattern

Java

Ví dụ sau sử dụng kịch bản window/scrolling

// the Window interfaceinterface Window {    public void draw(); // draws the Window    public String getDescription(); // returns a description of the Window}// implementation of a simple Window without any scrollbarsclass SimpleWindow implements Window {    public void draw() {        // draw window    }    public String getDescription() {        return "simple window";    }}

Các lớp sau chứa các trang trí cho tất cả các lớp Window, bao gồm cả trang trí của chính các lớp đó.

// abstract decorator class - note that it implements Windowabstract class WindowDecorator implements Window {    protected Window decoratedWindow; // the Window being decorated    public WindowDecorator(Window decoratedWindow) {        this.decoratedWindow = decoratedWindow;    }}// the first concrete decorator which adds vertical scrollbar functionaliyclass VerticalScrollBarDecorator extends WindowDecorator {    public VerticalScrollBarDecorator (Window decoratedWindow) {        super(decoratedWindow);    }     public void draw() {        drawVerticalScrollBar();        decoratedWindow.draw();    }    private void drawVerticalScrollBar() {        // draw the vertical scrollbar    }    public String getDescription() {        return decoratedWindow.getDescription() + ", including vertical scrollbars";    }}// the second concrete decorator which adds horizontal scrollbar functionaliyclass HorizontalScrollBarDecorator extends WindowDecorator {    public HorizontalScrollBarDecorator (Window decoratedWindow) {        super(decoratedWindow);    }    public void draw() {        drawHorizontalScrollBar();        decoratedWindow.draw();    }    private void drawHorizontalScrollBar() {        // draw the horizontal scrollbar    }    public String getDescription() {        return decoratedWindow.getDescription() + ", including horizontal scrollbars";    }}

Đây là chương trình test, nó tạo một mẫu Window sẽ được trang trí đầy đủ (chẳng hạn với các thanh trượt dọc và ngang) và in ra mô tả của nó:

public class DecoratedWindowTest {    public static void main(String[] args) {        // create a decorated Window with horizonal and vertical scrollbars        Window decoratedWindow = new HorizontalScrollBarDecorator(                new VerticalScrollBarDecorator(new SimpleWindow()));        // print the Window's description        System.out.println(decoratedWindow.getDescription());    }}

Kết quả in ra của chương trình là ""simple window, including vertical scrollbars, including horizontal scrollbars". Chú ý cách mà hàm getDescription method của hai trang trí trước tiên lấy mô tả của Window đã được trang trí và "trang trí" nó với một hậu tố. Đây là mẫu decorator.

C++

Component

class Car {    public:        Car() {};        virtual float CalculateCost() {};};

Concreate Component

class DefaultCar: public Car {    private:         float costOfWheels = 4.0;        float costOfChassis = 10.5;        float costOfEngine = 35;    public:        float CalculateCost() {            return costOfWheels + costOfChassis + costOfEngine;        }};

Decorator

class Decorator: public Car {    protected:        Car* car;    public:        Decorator(Car* paramCar) {            car = paramCar;        }	virtual float CalculateCost() {};};

Concreate Decorator

class GPSDecorator: public Decorator {    private:        float costOfGpsDevice = 9.3;    public:        GPSDecorator(Car* paramCar): Decorator(paramCar){}        float CalculateCost() {            return car->CalculateCost() + costOfGpsDevice;        }};
class SafeDecorator: public Decorator {    private:        float costOfSafeSensors = 15;    public:        SafeDecorator(Car* paramCar): Decorator(paramCar){}        float CalculateCost() {            return car->CalculateCost() + costOfSafeSensors;        }};
class HifiDecorator: public Decorator {    private:        float costOfSpeaker = 9;        float costOfAmpli = 15;    public:        HifiDecorator(Car* paramCar): Decorator(paramCar){}        float CalculateCost() {            return car->CalculateCost() + costOfSpeaker + costOfAmpli;        }};
class AutoDecorator: public Decorator {    private:        float costOfAutoProcessor = 20;    public:        AutoDecorator(Car* paramCar): Decorator(paramCar){}        float CalculateCost() {            return car->CalculateCost() + costOfAutoProcessor;        }};

Client

int main() {   Car* defaultCar = new DefaultCar();   Car* safeCar = new SafeDecorator(defaultCar);   Car* GPSAndSafeCar = new SafeDecorator(new GPSDecorator(defaultCar));   Car* HifiAndGPSAndSafeCar = new HifiDecorator(new SafeDecorator(new GPSDecorator(defaultCar)));   Car* AutoAndHifiAndGPSAndSafeCar = new AutoDecorator(new HifiDecorator(new SafeDecorator(new GPSDecorator(defaultCar))));   cout << "Cost of Default car: " << defaultCar->CalculateCost() << "\n";   cout << "Cost of Safe car: " << safeCar->CalculateCost() << "\n";   cout << "Cost of GPS and Safe car: " << GPSAndSafeCar->CalculateCost() << "\n";   cout << "Cost of GPS and Safe and HiFi car: " << HifiAndGPSAndSafeCar->CalculateCost() << "\n";   cout << "Cost of Auto and GPS and Safe and HiFi car: " << AutoAndHifiAndGPSAndSafeCar->CalculateCost() << "\n";   return 0;}

Build with G++